#include <queue>
#include <mutex>
#include <condition_variable> 
#include <thread>
#include <iostream>
std::mutex mtx; 					// 定义互斥锁，用于保护共享数据
std::condition_variable cv; 		// 定义条件变量，用于协调生产者和消费者线程
std::queue<int> queue;			// 定义一个整数类型的队列，用作生产者和消费者之间的缓冲区

// 数据生产函数
int produce_data(int id) {
    return id * 2; 				// 以简单的方式生成数据，例如id的两倍
}

// 数据处理函数
void process_product(int product) {
    // 数据处理逻辑，可以是任何处理步骤，例如打印、计算等
    std::cout << "Processed product: " << product << std::endl;
}

// 生产者函数
void producer(int id) {
    int product = produce_data(id);  				// 生产数据
    {
        std::lock_guard<std::mutex> lck(mtx); 		// 自动加锁
        queue.push(product);						// 将生产出的数据放入队列
        // 自动解锁：当lock_guard对象被销毁时，它会自动释放锁
    }
    cv.notify_one();                         			// 通知一个正在等待的消费者
}

// 消费者函数
void consumer() {
    std::unique_lock<std::mutex> lck(mtx);   		// 加锁，但允许在等待时解锁
    cv.wait(lck, [] { return !queue.empty(); }); 	// 等待直到队列不为空
    int product = queue.front();             			// 获取队列前端的数据
    queue.pop();                            			// 移除已消费的数据
    lck.unlock();                           			// 手动解锁
    process_product(product);               			// 处理数据
}

int main() {
    std::thread producer1(producer, 1);  			// 创建生产者线程，id为1
    std::thread producer2(producer, 2);  			// 创建生产者线程，id为2
    std::thread consumer1(consumer);     			// 创建消费者线程

    // 等待线程结束
    producer1.join();
    producer2.join();
    consumer1.join();

    return 0;
}